/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controladores;

import static Auxiliares.MensajesCodigosError.CAMPO_OBLIGATORIO;
import static Auxiliares.MensajesCodigosError.CORREO_ERRONEO;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JTextField;

/**
 *
 * @author Marko
 */
public class ControladorCamposTexto {

////////////////////////////////////////////////////////////////////////////////
// Constructores
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Interfaz de la clase
////////////////////////////////////////////////////////////////////////////////

    /**
     * establece el campo en modo de uso
     * @param _campoEnUso 
     */
    public void campoEnUso(JTextField _campoEnUso){
        _campoEnUso.setBackground(Color.white);
        _campoEnUso.setToolTipText(null);
    }
    
    /**
     * metodo para cambiar el foco del cursor al dar enter
     * @param evt 
     */
    public void enterTab(java.awt.event.KeyEvent evt){
        if(evt.getKeyCode() == KeyEvent.VK_ENTER){
            Robot tecla = null;
            try {
                tecla = new Robot();
            } catch (AWTException e1) {
                System.out.println(e1);
            }
            tecla.keyPress(KeyEvent.VK_TAB);
        }
    }
    
    /**
     * convierte la letra presionada en su version mayuscula
     * @param _tecla 
     */
    public void formatoMayusculas (java.awt.event.KeyEvent _tecla){
        char tecla = _tecla.getKeyChar();
        _tecla.setKeyChar(Character.toUpperCase(tecla));
    }
    
    /**
     * verifica que la tecla presionada sea un numero y este dentro de la longitud maxima establecida
     * @param evt
     * @param _numero
     * @param _longitudMaximaCampo
     * @return devuelve verdadero si la telca presionada es un numero y con la longitud deseada
     * de lo contrario la tecla se consume
     */
    public boolean formatoNumericoLimitado(
     java.awt.event.KeyEvent evt,
     String _numero,
     int _longitudMaximaCampo
    ){
        
        char tecla = evt.getKeyChar();
        boolean teclaAceptada = true;
        if(tecla >= '0' && tecla <= '9'){
            int longitudNumero = _numero.length();
            if ( longitudNumero >= _longitudMaximaCampo){
                evt.consume();
                return !teclaAceptada;
            }
        }else{
            evt.consume();
            return !teclaAceptada;
        }
        
        return teclaAceptada;
    }
    
    /**
     * verifica que el campo de texto que le pasen este en blanco, en caso de estarlo
     * alertara al gestor de mensajes
     * @param _CampoTexto
     * @return devuelve verdadero si y solo si el campo de texto que le pasan esta en blanco
     */
    public boolean esCampoTextoEnBlanco(JTextField _CampoTexto){
        boolean textoEnBlanco = true;
        String texto = _CampoTexto.getText();
        
        if(texto.trim().equals("")){
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(CAMPO_OBLIGATORIO, _CampoTexto);
            return textoEnBlanco;
        }else{
            return !textoEnBlanco;
        }
    }
    
    /**
     * verifica que el correo este bien escrito y que contenga un dominio
     * @param _campoCorreo
     * @return Devuelve verdadero si y solo si el correo cumple con los requerimientos necesarios
     */
    public boolean formatoCorreo(JTextField _campoCorreo){
        String correo = _campoCorreo.getText();
        boolean correoCorrecto = true;
        
        Pattern pat;
        Matcher mat;
        pat = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
        mat = pat.matcher(correo);
        if (mat.find()) {
            //para verificar el correo ingresado
            //System.out.println("[" + mat.group() + "]");
            return correoCorrecto;
        }else{
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(CORREO_ERRONEO, _campoCorreo);
            return !correoCorrecto;
        } 
    }
    
    /**
     * Restringe al campo de texto a solo aceptar teclas alfanumericas y algunos
     * caracteres especiales adicionales para escribir la direccion
     * @param _tecla
     * @return Devuelve verdadero en caso de que la tecla presionada sea correcta
     */
    public boolean formatoDireccion(java.awt.event.KeyEvent _tecla){
        boolean teclaAceptada = true;
        char tecla = _tecla.getKeyChar();
        
        if(esTeclaNumerica(tecla) 
                || esTeclaAlfabetica(tecla)
                || esCaracterEspecial(tecla)
                || tecla == ' '){
            return teclaAceptada;
        }else{
            _tecla.consume();
            return !teclaAceptada;
        }
    }
    
    /**
     * Restringe el campo de texto a solo aceptar teclas numericas
     * @param _tecla
     * @return devuelve verdadero si y solo si la tecla escrita es numerica
     * de lo contrario la tecla se consume
     */
    public boolean formatoNumerico(java.awt.event.KeyEvent _tecla){
        char tecla = _tecla.getKeyChar();
        boolean teclaAceptada = true;
        
        if(esTeclaNumerica(tecla)){
            return teclaAceptada;
        }else{
            _tecla.consume();
            return !teclaAceptada;
        }
    }
    
    /**
     * restringe el campo de texto a solo aceptar teclas alfabeticas
     * @param _tecla
     * @return devuelve verdadero si la tecla presionada es alfabetica
     * de lo contrario la tecla se consume
     */
    public boolean formatoAlfabetico(java.awt.event.KeyEvent _tecla){
        boolean teclaAceptada = true;
        char tecla = _tecla.getKeyChar();
        
        if(esTeclaAlfabetica(tecla) || esCaracterEspecial(tecla)){
            return teclaAceptada;
        }else{
            _tecla.consume();
            return !teclaAceptada;
        }
    }
    
    /**
     * restringe el campo de texto a aceptar teclas alfabeticas y numericas
     * @param _tecla
     * @return true si y solo si la tecla presionada cumple con el formato Alfa NUmerico
     * de lo contrario la tecla se consume
     */
    public boolean formatoAlfaNumerico(java.awt.event.KeyEvent _tecla){
        boolean teclaAceptada = true;
        char tecla = _tecla.getKeyChar();
        
        if( esTeclaNumerica(tecla)
                || esTeclaAlfabetica(tecla)
                || esCaracterEspecial(tecla)
        ){
            return teclaAceptada;
        }else{
            _tecla.consume();
            return !teclaAceptada;
        }
    }

    /**
     * verifica que el texto del campo que le pasen cumpla con la longitud solicitada
     * @param _texto
     * @param _longitud
     * @return Devuelve verdadero si y solo si el texto en el campo es de la longitud deseada
     */
    public boolean verificarLongitud(JTextField _texto, int _longitud){
        int longitudNumero = _texto.getText().length();
        boolean telefonoCorrecto = true;
        
        if(longitudNumero == _longitud){
            return telefonoCorrecto;
        }else{
            return !telefonoCorrecto;
        }
    }
    
////////////////////////////////////////////////////////////////////////////////
// Metodos Privados
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * veridica que la tecla presionada sea numerica
     * @param _tecla
     * @return devuelve verdadero en caso de que la tecla presionada sea nuemrica
     */
    private boolean esTeclaNumerica(char _tecla){
        boolean teclaNumerica = true;
        
        if( (_tecla >= '0' && _tecla <= '9')){
            return teclaNumerica;
        }else{
            return !teclaNumerica;
        }
    }
    
    /**
     * verifica que la tecla presionada sea alfabetica
     * @param _tecla
     * @return devuelve verdadero en caso de que la tecla presionada sea alfabetica
     */
    private boolean esTeclaAlfabetica(char _tecla){
        boolean teclaAlfabetica = true;
        
        if( ( (_tecla >= 'a' && _tecla <= 'z')
                || (_tecla >= 'A' && _tecla <= 'Z'))
        ){
            return teclaAlfabetica;
        }else{
            return !teclaAlfabetica;
        }
    }
    
    /**
     * verifica que la tecla presionada sea un caracter especial
     * @param _tecla
     * @return devuelve verdadero en caso de que la tecla presionada sea un caracter especial
     */
    private boolean esCaracterEspecial(char _tecla){
        boolean teclaEspecial = true;
        
        if(_tecla == '.'
                || _tecla == '/'
                || _tecla == '-'
                || _tecla == '#'
                || _tecla == '*'
                || _tecla == '.'
                || _tecla == 'Ñ'
                || _tecla == 'ñ'
                || _tecla == ' '
        ){
            return teclaEspecial;
        }else{
            return !teclaEspecial;
        }
    }
    
////////////////////////////////////////////////////////////////////////////////
// Declaracion de Variables
////////////////////////////////////////////////////////////////////////////////

}